/**
 * @file transport_net_config.c
 * @brief 网络传输驱动配置加载实现
 * @details 实现从配置文件加载网络传输配置的功能
 * 
 * @author 电网协议开发团队
 * @date 2024
 * @version 1.0
 */

#include "../include/transport_net_config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

// 默认配置文件路径
#define DEFAULT_CONFIG_FILE "drivers/net/config/transport_net.conf"

// 默认配置值
#define DEFAULT_SERVER_IP "127.0.0.1"
#define DEFAULT_SERVER_PORT 2404
#define DEFAULT_LOCAL_PORT 0
#define DEFAULT_TIMEOUT_MS 5000
#define DEFAULT_RETRY_COUNT 3
#define DEFAULT_KEEP_ALIVE true
#define DEFAULT_HEARTBEAT_INTERVAL 30000
#define DEFAULT_HEARTBEAT_TIMEOUT 60000

/**
 * @brief 安全的字符串复制函数（避免strncpy截断警告）
 */
static inline void safe_strncpy(char *dest, const char *src, size_t dest_size) {
    if (dest == NULL || src == NULL || dest_size == 0) {
        return;
    }
    size_t src_len = strlen(src);
    size_t copy_len = (src_len < dest_size - 1) ? src_len : (dest_size - 1);
    memcpy(dest, src, copy_len);
    dest[copy_len] = '\0';
}

/**
 * @brief 去除字符串首尾空格
 */
static void trim_string(char* str) {
    if (!str) return;
    
    char* start = str;
    char* end = str + strlen(str) - 1;
    
    // 去除尾部空格
    while (end > start && (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n')) {
        end--;
    }
    *(end + 1) = '\0';
    
    // 去除首部空格
    while (*start == ' ' || *start == '\t') {
        start++;
    }
    
    // 移动字符串到开头
    if (start != str) {
        memmove(str, start, strlen(start) + 1);
    }
}

/**
 * @brief 检查是否为注释行
 */
static int is_comment_line(const char* line) {
    if (!line) return 0;
    
    // 跳过前导空格
    while (*line == ' ' || *line == '\t') {
        line++;
    }
    
    return (*line == '#');
}

/**
 * @brief 解析配置项
 */
static int parse_config_item(const char* line, char* key, char* value) {
    if (!line || !key || !value) {
        return -1;
    }
    
    // 查找等号
    const char* eq_pos = strchr(line, '=');
    if (!eq_pos) {
        return -1;
    }
    
    // 提取key
    size_t key_len = eq_pos - line;
    if (key_len >= 128) {
        key_len = 127;
    }
    safe_strncpy(key, line, sizeof(key));
    // 手动截断到key_len
    key[key_len] = '\0';
    trim_string(key);
    
    // 提取value
    const char* value_start = eq_pos + 1;
    safe_strncpy(value, value_start, sizeof(value));
    trim_string(value);
    
    return 0;
}

/**
 * @brief 从配置文件加载网络传输配置
 */
net_transport_error_t transport_net_config_load(const char* config_file, net_transport_config_t* config) {
    if (!config) {
        return NET_TRANSPORT_ERROR_INVALID_PARAM;
    }
    
    // 使用默认路径或用户指定的路径
    const char* file_path = config_file ? config_file : transport_net_config_get_default_path();
    
    // 初始化默认配置
    memset(config, 0, sizeof(net_transport_config_t));
    safe_strncpy(config->server_ip, DEFAULT_SERVER_IP, sizeof(config->server_ip));
    config->server_port = DEFAULT_SERVER_PORT;
    config->local_port = DEFAULT_LOCAL_PORT;
    config->timeout_ms = DEFAULT_TIMEOUT_MS;
    config->retry_count = DEFAULT_RETRY_COUNT;
    config->keep_alive = DEFAULT_KEEP_ALIVE;
    config->heartbeat_interval = DEFAULT_HEARTBEAT_INTERVAL;
    config->heartbeat_timeout = DEFAULT_HEARTBEAT_TIMEOUT;
    
    // 尝试打开配置文件
    FILE* fp = fopen(file_path, "r");
    if (!fp) {
        // 配置文件不存在，使用默认配置
        return NET_TRANSPORT_SUCCESS;
    }
    
    char line[512];
    int line_num = 0;
    
    // 读取配置文件
    while (fgets(line, sizeof(line), fp)) {
        line_num++;
        
        // 去除换行符
        line[strcspn(line, "\r\n")] = '\0';
        
        // 跳过空行和注释行
        if (strlen(line) == 0 || is_comment_line(line)) {
            continue;
        }
        
        // 解析配置项
        char key[128];
        char value[256];
        if (parse_config_item(line, key, value) != 0) {
            // 解析失败，跳过这一行
            continue;
        }
        
        // 处理配置项
        if (strcmp(key, "server_ip") == 0) {
            safe_strncpy(config->server_ip, value, sizeof(config->server_ip));
        } else if (strcmp(key, "server_port") == 0) {
            config->server_port = (uint16_t)atoi(value);
        } else if (strcmp(key, "local_port") == 0) {
            config->local_port = (uint16_t)atoi(value);
        } else if (strcmp(key, "timeout_ms") == 0) {
            config->timeout_ms = (uint32_t)atoi(value);
        } else if (strcmp(key, "retry_count") == 0) {
            config->retry_count = (uint32_t)atoi(value);
        } else if (strcmp(key, "keep_alive") == 0) {
            config->keep_alive = (strcmp(value, "true") == 0 || strcmp(value, "1") == 0);
        } else if (strcmp(key, "heartbeat_interval") == 0) {
            config->heartbeat_interval = (uint32_t)atoi(value);
        } else if (strcmp(key, "heartbeat_timeout") == 0) {
            config->heartbeat_timeout = (uint32_t)atoi(value);
        }
    }
    
    fclose(fp);
    
    return NET_TRANSPORT_SUCCESS;
}

/**
 * @brief 保存网络传输配置到文件
 */
net_transport_error_t transport_net_config_save(const char* config_file, const net_transport_config_t* config) {
    if (!config) {
        return NET_TRANSPORT_ERROR_INVALID_PARAM;
    }
    
    // 使用默认路径或用户指定的路径
    const char* file_path = config_file ? config_file : transport_net_config_get_default_path();
    
    // 打开配置文件（写入模式）
    FILE* fp = fopen(file_path, "w");
    if (!fp) {
        return NET_TRANSPORT_ERROR_SYSTEM;
    }
    
    // 写入配置文件
    fprintf(fp, "# 网络传输驱动配置文件\n");
    fprintf(fp, "# 用于配置TCP/IP网络连接的参数\n");
    fprintf(fp, "\n");
    fprintf(fp, "# ==================== 网络连接配置 ====================\n");
    fprintf(fp, "# 服务器IP地址\n");
    fprintf(fp, "server_ip=%s\n", config->server_ip);
    fprintf(fp, "# 服务器端口\n");
    fprintf(fp, "server_port=%u\n", config->server_port);
    fprintf(fp, "# 本地端口（0表示系统自动分配）\n");
    fprintf(fp, "local_port=%u\n", config->local_port);
    fprintf(fp, "# 连接超时时间（毫秒）\n");
    fprintf(fp, "timeout_ms=%u\n", config->timeout_ms);
    fprintf(fp, "# 重试次数\n");
    fprintf(fp, "retry_count=%u\n", config->retry_count);
    fprintf(fp, "\n");
    fprintf(fp, "# ==================== 心跳配置 ====================\n");
    fprintf(fp, "# 保持连接\n");
    fprintf(fp, "keep_alive=%s\n", config->keep_alive ? "true" : "false");
    fprintf(fp, "# 心跳检测间隔（毫秒），0表示不启用\n");
    fprintf(fp, "heartbeat_interval=%u\n", config->heartbeat_interval);
    fprintf(fp, "# 心跳超时时间（毫秒），超过此时间无响应认为连接断开\n");
    fprintf(fp, "heartbeat_timeout=%u\n", config->heartbeat_timeout);
    
    fclose(fp);
    
    return NET_TRANSPORT_SUCCESS;
}

/**
 * @brief 获取默认配置文件路径
 */
const char* transport_net_config_get_default_path(void) {
    return DEFAULT_CONFIG_FILE;
}
